#pragma once
#include <string>
#include <openssl/evp.h>
#include "User.h"
#include <jwt.h>

using std::string;

/*
    通过定义静态方法，属于类本身，而非类的实例
    可以直接通过类名调用，无需创建类的实体

    属于工具函数，操作不依赖实例状态，因此设计为静态方法

*/

class CryptoUtil
{
public:
    // 生成制定长度的随机盐值
    static string generate_salt(int length = 8);

    // 对密码进行加盐后的哈希：使用ShA256算法
    // 将密码和颜值一起进行哈希计算，提高安全
    static string hash_password(const string &password, const string &salt, const EVP_MD *md = EVP_sha256());

    // 根据用户名生成token
    static string generate_token(const User &user, jwt_alg_t algorithm = JWT_ALG_HS256);

    // 验证Token是否有效，匹配用户名
    static bool verify_token(const string &token, User &user);
    // 对文件内容进行哈希
    static string hash_file(const string &filename);

private:
    // 禁止实例化，只提供静态方法
    CryptoUtil() = delete;
    ~CryptoUtil() = delete;
};